package com.example.service;

import com.example.common.Result;
import com.example.common.PageResult;
import com.example.dto.RechargeDTO;
import com.example.dto.RechargeRecordQueryDTO;
import com.example.vo.RechargeRecordVO;

import java.math.BigDecimal;
import java.util.Map;

public interface RechargeService {
    
    /**
     * 用户充值
     */
    Result<String> recharge(Long userId, RechargeDTO rechargeDTO);

    /**
     * 用户充值（从当前上下文获取用户信息）
     */
    Result<String> userRecharge(RechargeDTO rechargeDTO);

    /**
     * 管理员为用户充值
     */
    Result<String> adminRecharge(Long adminUserId, String adminUsername, RechargeDTO rechargeDTO);

    /**
     * 管理员为用户充值（从当前上下文获取管理员信息）
     */
    Result<String> adminRecharge(RechargeDTO rechargeDTO);
    
    /**
     * 根据订单号查询充值记录
     */
    Result<RechargeRecordVO> getRechargeRecordByOrderNo(String orderNo);
    
    /**
     * 根据用户ID查询充值记录列表
     */
    Result<PageResult<RechargeRecordVO>> getUserRechargeRecords(Long userId, int page, int size);

    /**
     * 获取当前用户充值记录
     */
    Result<PageResult<RechargeRecordVO>> getMyRechargeRecords(int page, int size);
    
    /**
     * 获取当前用户充值记录（带查询条件）
     */
    Result<PageResult<RechargeRecordVO>> getMyRechargeRecords(int page, int size, RechargeRecordQueryDTO queryDTO);
    
    /**
     * 分页查询充值记录（管理员使用）
     */
    Result<PageResult<RechargeRecordVO>> getRechargeRecordPage(RechargeRecordQueryDTO queryDTO);
    
    /**
     * 获取充值统计信息
     */
    Result<Map<String, Object>> getRechargeStatistics();
    
    /**
     * 获取用户充值统计信息
     */
    Result<Map<String, Object>> getUserRechargeStatistics(Long userId);

    /**
     * 获取当前用户充值统计信息
     */
    Result<Map<String, Object>> getMyRechargeStatistics();
    
    /**
     * 获取今日充值统计
     */
    Result<Map<String, Object>> getTodayRechargeStatistics();
    
    /**
     * 根据时间范围获取充值统计
     */
    Result<Map<String, Object>> getRechargeStatisticsByDateRange(String startTime, String endTime);
    
    /**
     * 更新充值记录状态
     */
    Result<Void> updateRechargeStatus(String orderNo, Integer status, String remark);
}
